/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
/*
 * Topology Viewer
 */

package cgl.narada.topology.viewer;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Iterator;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/**
 * adapter class specific for <code>NodeFrame</code> in order to handle
 * windowClosing event.
 */
class nodeWindowAdapter extends WindowAdapter {
    NodeFrame frame;
    public nodeWindowAdapter(NodeFrame frame) {
	this.frame=frame;
    }
    public void windowClosing(WindowEvent we) {
	frame.setVisible(false);
    }  
}

/**
 * This class represents a frame displaying node/link information when a mouse
 * is right clicked on the image.
 */
public class NodeFrame extends JFrame {

    private int curX, curY;
    private List linksForNode, clientsForNode;
    private Node nodeInformation;
    private Node endNode1, endNode2;

    private Dimension area;
    private JScrollPane scroller;
    private NodePanel nodePanel;
    
    /**
     * Constructor used whenever right click occurs during node information
     * mode.
     */
    public NodeFrame(Node n, List links, List clients) {
	super("Node Description");
	nodeInformation = n;
	linksForNode = links;
	clientsForNode = clients;
	setInitialComponents();
    }
    
    /**
     * Constructor used whenever right click occurs during link information
     * mode.
     */
    public NodeFrame(Node n1, Node n2, List links) {
	super("Link Description");
	nodeInformation = null;
	endNode1 = n1;
	endNode2 = n2;
	linksForNode = links;
	setInitialComponents();
    }

    public void setInitialComponents() {
	if (nodeInformation != null) {
	    area = new Dimension(200, (clientsForNode.size() +
				       linksForNode.size()) * 20 + 100);
	} else {
	    area = new Dimension(200, linksForNode.size() * 10 + 100);
	}
	nodeWindowAdapter adapter = new nodeWindowAdapter(this);    	
	addWindowListener(adapter);     
	JFrame.setDefaultLookAndFeelDecorated(true);

	nodePanel = new NodePanel();
	nodePanel.setBackground(Color.WHITE);
	nodePanel.setPreferredSize(area);
	nodePanel.scrollRectToVisible(new Rectangle(0, 0, area.width,
						    area.height));
	scroller = new JScrollPane(nodePanel);
        scroller.setPreferredSize(area);
	JPanel newContentPane = new JPanel();
	newContentPane.add(scroller, BorderLayout.CENTER);

	newContentPane.setOpaque(true);
	this.setContentPane(newContentPane);

	this.pack();
	this.setVisible(true);
    }

    public class NodePanel extends JPanel {
	public void paintComponent(Graphics g) {
	    super.paintComponent(g);
	    g.setColor(Color.black);	  
	    curY=30;
	    curX=10;
	    if (nodeInformation != null) {
		nextLine("NodeAddress: " + nodeInformation.getNodeAddress(), g);
	    } else {
		nextLine("Links Between Node: " + endNode1.getNodeAddress()
			 + " and Node: " + endNode2.getNodeAddress(), g);
	    }
	    Iterator it = linksForNode.iterator();
	    if (nodeInformation != null) {
		nextLine("Connected Node Addresses: ", g);
	    } 
	    while (it.hasNext()) {
		String s1 = (String) it.next();
		nextLine(s1, g);
	    }
	    if (nodeInformation != null) {
		nextLine("Clients: ", g);
	    }
	    if (nodeInformation != null) {
		it = clientsForNode.iterator();
		while (it.hasNext()) {
		    String s2 = (String) it.next();
		    nextLine(s2, g);
		}
	    }
	}

	/**
	 * Writes a single line on the frame. Increments <code>curY</code>
	 */
	void nextLine(String s, Graphics g) {
	    FontMetrics fm = g.getFontMetrics();
	    curY += fm.getHeight();
	    curX = 10;
	    g.drawString(s, curX, curY);
	    curX = fm.stringWidth(s);
	}	
    }
	
};
